package com.prd.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.prd.config.LoginInterceptor;
import com.prd.dto.SysStaticMenuDTO;
import com.prd.model.LoginUser;
import com.prd.model.SysStaticMenuDO;
import com.prd.mapper.SysStaticMenuMapper;
import com.prd.service.SysStaticMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.prd.util.CommonUtil;
import com.prd.util.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author lizhaoyi
 * @since 2024-01-21
 */
@Service
public class SysStaticMenuServiceImpl extends ServiceImpl<SysStaticMenuMapper, SysStaticMenuDO> implements SysStaticMenuService {


    @Autowired
    private SysStaticMenuMapper staticMenuMapper;

    /**
     * 获取菜单列表
     * @return
     */
    @Override
    public JsonData getAllList() {
        return JsonData.buildSuccess(staticMenuMapper.selectList(new QueryWrapper<>()));
    }

    /**
     * 根据用户角色获取菜单列表
     * @param roleId
     * @return
     */
    @Override
    public JsonData getListByRoleId(Long roleId) {

        LoginUser loginUser = LoginInterceptor.threadLocal.get();

        List<SysStaticMenuDO> sysStaticMenuDOS = staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>()
                .eq(SysStaticMenuDO::getUserId, loginUser.getId())
                .eq(SysStaticMenuDO::getRoleId, roleId));

        return JsonData.buildSuccess(sysStaticMenuDOS);
    }

    /**
     * 根据角色id获取当前用户顶级菜单
     * @param roleId
     * @return
     */
    @Override
    public JsonData getTopListByRoleId(String roleId) {
        LoginUser loginUser = LoginInterceptor.threadLocal.get();
        List<SysStaticMenuDO> sysStaticMenuDOS = staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>()
                .eq(SysStaticMenuDO::getUserId, loginUser.getId())
                .eq(SysStaticMenuDO::getRoleId, roleId));
        //筛选顶级菜单
        List<SysStaticMenuDO> topMenuList = sysStaticMenuDOS.stream().filter(menu -> menu.getMenuId().length() == 2).collect(Collectors.toList());
        return JsonData.buildSuccess(topMenuList);
    }

    /**
     * 保存菜单列表
     * @param menuDTOs
     * @return
     */
    @Override
    public JsonData saveMenus(List<SysStaticMenuDTO> menuDTOs) {
        LoginUser loginUser = LoginInterceptor.threadLocal.get();
        for (SysStaticMenuDTO menuDTO : menuDTOs) {
            if (loginUser == null) {
                menuDTO.setCreator("system");
            }else {
                menuDTO.setCreator(loginUser.getName());
            }
            menuDTO.setCreateTime(new Date());
        }
        List<SysStaticMenuDO> sysStaticMenuDOS = CommonUtil.dtoListTransfer(menuDTOs, SysStaticMenuDO.class);
        Map<String, List<SysStaticMenuDO>> titleMap = sysStaticMenuDOS.stream().collect(Collectors.groupingBy(SysStaticMenuDO::getTitle));
        Set<String> titles = titleMap.keySet();
        List<SysStaticMenuDO> staticMenuDOS = staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>().in(SysStaticMenuDO::getTitle, titles));
        if (!CollectionUtils.isEmpty(staticMenuDOS)) {
            for (SysStaticMenuDO staticMenuDO : staticMenuDOS) {
                if (titleMap.get(staticMenuDO.getTitle()) != null) {
                    return JsonData.buildError(staticMenuDO.getTitle()+" 菜单名称已存在");
                }
            }
        }
        this.saveBatch(sysStaticMenuDOS);
        return JsonData.buildSuccess() ;
    }

    /**
     * 根据用户id获取菜单列表
     * @param userId
     * @return
     */
    @Override
    public JsonData getListByUserId(Long userId) {
        return JsonData.buildSuccess(staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>().eq(SysStaticMenuDO::getUserId,userId)));
    }

    /**
     * 根据用户id获取顶级菜单列表
     * @param userId
     * @return
     */
    @Override
    public JsonData getTopListByUserId(Long userId) {
        List<SysStaticMenuDO> sysStaticMenuDOS = staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>().eq(SysStaticMenuDO::getUserId, userId));
        return getJsonData(sysStaticMenuDOS);
    }


    /**
     * 获取当前用户菜单列表
     * @return
     */
    @Override
    public JsonData getList() {

        LoginUser loginUser = LoginInterceptor.threadLocal.get();

        return JsonData.buildSuccess(staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>().eq(SysStaticMenuDO::getUserId,loginUser.getId())));
    }

    /**
     * 获取当前用户顶级菜单列表
     * @return
     */
    @Override
    public JsonData getTopList() {

        LoginUser loginUser = LoginInterceptor.threadLocal.get();

        List<SysStaticMenuDO> sysStaticMenuDOS = staticMenuMapper.selectList(new LambdaQueryWrapper<SysStaticMenuDO>().eq(SysStaticMenuDO::getUserId, loginUser.getId()));

        return getJsonData(sysStaticMenuDOS);
    }

    private JsonData getJsonData(List<SysStaticMenuDO> sysStaticMenuDOS) {
        List<SysStaticMenuDO> result = new ArrayList<>(sysStaticMenuDOS.size());

        if (!CollectionUtils.isEmpty(sysStaticMenuDOS)) {
            result = sysStaticMenuDOS.stream().filter(m -> m.getMenuId().length() == 2).collect(Collectors.toList());
        }
        return JsonData.buildSuccess(result);
    }


}
